class Solution {
public:
    int findMaxLength(vector<int>& nums) {
        //前缀和与下标位置的映射关系
        unordered_map<int, int> hash;
        hash[0] = -1;
        //当前位置的和
        int counter = 0;
        //最长的字串长度
        int length = 0;

        for(int i = 0; i < nums.size(); i++)
        {
            //计算和
            if(nums[i] == 1)
                counter++;
            else
                counter--;

            if(hash.count(counter))
            {
                length = max(length, i - hash[counter]);
            }
            else
            {
                hash[counter] = i;
            }
        }
        return length;
    }
};

//该前缀和并不是寻找和等于0的区间，而是找前缀和相同的情况，
//一旦相同了，那么hash记录的下标和当前位置下标中间的元素，相当于是0和1数量一样的区间了。

//{0, 1}的情况是用来表示，从头到当前位置的情况。因为和为0的时候也是一种情况表示从头到当前位置的区间符合条件。